﻿
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cotizav.CONEXION;
using System.Transactions;
using System.Windows.Forms;
using Cotizav.CONTROLADOR;
using System.Data.Linq;
using System.Data;

namespace Cotizav
{
    public class CtrlEquipo
    {
        private ConexionDataContext conexion;
        private CtrlCaracteristica ctCaracteristica;
        private CtrlCondicion ctCondicion;
        private CtrlListaTarifa ctListaTarifa;

        public CtrlEquipo()
        {
            ctCaracteristica = new CtrlCaracteristica();
            ctCondicion = new CtrlCondicion();
            ctListaTarifa = new CtrlListaTarifa();
        }

        internal List<EQUIPO> getListEquipos()
        {
            throw new System.NotImplementedException();
        }

        internal List<CARACTERISTICA> getListCaracteristicas(EQUIPO equipo)
        {
            throw new System.NotImplementedException();
        }

        internal List<CARACTERISTICA> registrarCaracteristicas()
        {
            throw new System.NotImplementedException();
        }

        internal List<EQUIPO> getListEquipo()
        {
            using ( conexion= new ConexionDataContext())
            {
                DataLoadOptions dlo = new DataLoadOptions();
                dlo.LoadWith<EQUIPO>(e => e.MODELO);
                conexion.LoadOptions = dlo;
                var query = conexion.EQUIPO.Where(x => x.eliminado == 0);

                return query.ToList();
            }
        }

        internal EQUIPO getEquipo(string idEquipo)
        {
            using (conexion = new ConexionDataContext())
            {
                try
                {
                    var query = conexion.EQUIPO.SingleOrDefault(x => x.idEquipo == idEquipo && x.eliminado == 0);
                    return query;
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }

        internal DialogResult registrarEquipo(EQUIPO equipo, LISTA_TARIFA listaTarifa, List<CARACTERISTICA> caracteristicas)
        {
            using (TransactionScope transactionScope = new TransactionScope())
            {
                DialogResult result = DialogResult.Cancel;

                using (conexion = new ConexionDataContext())
                {
                    try
                    {
                        //insertamos el id
                        int correlativoEquipo = conexion.COTIZAV_CORRELATIVO.Single(x => x.IDENTIFICADOR == "COTIZAV").EQUIPO.Value;
                        string num = Convert.ToString(correlativoEquipo);
                        string numero = num.Trim().PadLeft(11, '0');
                        string idEquipo = "EQP_" + numero;

                        equipo.idEquipo = idEquipo;

                        //insertamos
                        conexion.EQUIPO.InsertOnSubmit(equipo);
                        conexion.SubmitChanges();
                        conexion.increm_ContEquipo();
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }

                //registramos la tarifa
                using (conexion = new ConexionDataContext())
                {
                    try
                    {
                        listaTarifa.idEquipo = equipo.idEquipo;
                        listaTarifa.eliminado = 0;

                        ctListaTarifa.registrarListaTarifa(listaTarifa, equipo);
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }

                //registramos las caracteristicas
                using (conexion = new ConexionDataContext())
                {
                    try
                    {
                        foreach (CARACTERISTICA carac in caracteristicas)
                        {
                            ctCaracteristica.registrarCaracteristica(carac, equipo);
                        }

                        transactionScope.Complete();
                        result = DialogResult.OK;
                        return result;
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }

                //registramos las condiciones
                //using (conexion = new ConexionDataContext())
                //{
                //    try
                //    {
                //        foreach (CONDICION cond in condiciones)
                //        {
                //            ctCondicion.registrarCondicion(cond, equipo);
                //        }

                //        transactionScope.Complete();
                //        result = DialogResult.OK;
                //        return result;
                //    }
                //    catch (Exception)
                //    {
                //        throw;
                //    }
                //}
            }
        }       

        internal DialogResult modificarEquipo(EQUIPO equipo, LISTA_TARIFA listaTarifa, List<CARACTERISTICA> caracteristicas)
        {
            using (TransactionScope transactionscope = new TransactionScope())
            {
                DialogResult result = DialogResult.Cancel;

                using (conexion = new ConexionDataContext())
                {
                    try
                    {
                        EQUIPO eqp = conexion.EQUIPO.Single(x => x.idEquipo == equipo.idEquipo);
                        eqp.nombreEquipo = equipo.nombreEquipo;
                        eqp.codigo = equipo.codigo;
                        eqp.serie = equipo.serie;
                        eqp.año = equipo.año;
                        eqp.cantidad = equipo.cantidad;
                        eqp.horas = equipo.horas;
                        eqp.esalquiler = equipo.esalquiler;
                        eqp.esventa = equipo.esventa;
                        eqp.valorVenta = equipo.valorVenta;
                        eqp.eliminado = eqp.eliminado;
                        eqp.marca = equipo.marca;

                        LISTA_TARIFA lista = conexion.LISTA_TARIFA.SingleOrDefault(x => x.idListaTarifa == listaTarifa.idListaTarifa);

                        if (lista != null) //se modifica
                        {
                            lista.tarifaHoraDia = listaTarifa.tarifaHoraDia;
                            lista.tarifaHoraSemana = listaTarifa.tarifaHoraSemana;
                            lista.tarifaHoraMes = listaTarifa.tarifaHoraMes;

                            lista.tarifaTotalDia = listaTarifa.tarifaTotalDia;
                            lista.tarifaTotalSemana = listaTarifa.tarifaTotalSemana;
                            lista.tarifaTotalMes = listaTarifa.tarifaTotalMes;

                            lista.horaxdia = listaTarifa.horaxdia;
                            lista.horaxsemana = listaTarifa.horaxsemana;
                            lista.horaxmes = listaTarifa.horaxmes;

                            lista.eliminado = listaTarifa.eliminado;
                            lista.moneda = listaTarifa.moneda;
                        }
                        else //se registra una nueva tarifa
                        {
                            ctListaTarifa.registrarListaTarifa(listaTarifa, equipo);
                        }

                        conexion.SubmitChanges();
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }

                using (conexion = new ConexionDataContext())
                {
                    //caracteristicas
                    try
                    {
                        List<CARACTERISTICA> caracteristicasAgregados = caracteristicas.Where(x => x.statusflag == "I").ToList();
                        List<CARACTERISTICA> caracteristicasEliminados = caracteristicas.Where(x => x.statusflag == "D").ToList();
                        List<CARACTERISTICA> caracteristicasModificados = caracteristicas.Where(x => x.statusflag == "U").ToList();

                        foreach (CARACTERISTICA carAdd in caracteristicasAgregados)
                        {
                            ctCaracteristica.registrarCaracteristica(carAdd, equipo);
                        }

                        foreach (CARACTERISTICA carUpd in caracteristicasModificados)
                        {
                            ctCaracteristica.actualizarCaracteristica(carUpd, equipo);
                        }

                        foreach (CARACTERISTICA carDel in caracteristicasEliminados)
                        {
                            ctCaracteristica.eliminarCaracteristica(carDel, equipo);
                        }

                        transactionscope.Complete();
                        result = DialogResult.OK;

                        return result;
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }

                //using (conexion = new ConexionDataContext())
                //{
                //    //condiciones
                //    try
                //    {
                //        List<CONDICION> condicionAgregados = condiciones.Where(x => x.statusflag == "I").ToList();
                //        List<CONDICION> condicionEliminados = condiciones.Where(x => x.statusflag == "D").ToList();

                //        foreach (CONDICION conAdd in condicionAgregados)
                //        {
                //            ctCondicion.registrarCondicion(conAdd, equipo);
                //        }

                //        foreach (CONDICION conDelete in condicionEliminados)
                //        {
                //            ctCondicion.eliminarCondicion(conDelete, equipo);
                //        }

                //        transactionscope.Complete();
                //        result = DialogResult.OK;

                //        return result;
                //    }
                //    catch (Exception)
                //    {
                //        throw;
                //    }
                //}
            }
        }

        internal List<EQUIPO> buscarEquipo(string columna, string value)
        {
            using (conexion = new ConexionDataContext())
            {
                List<EQUIPO> result = new List<EQUIPO>();
                try
                {
                    DataLoadOptions dlo = new DataLoadOptions();
                    dlo.LoadWith<EQUIPO>(m => m.MODELO);
                    dlo.LoadWith<EQUIPO>(s => s.SUCURSAL);
                    conexion.LoadOptions = dlo;

                    if (!string.IsNullOrWhiteSpace(value))
                    {
                        switch (columna)
                        {
                            case "nombreEquipo":
                                result = conexion.EQUIPO.Where(x => x.nombreEquipo.Contains(value)).ToList();
                                break;
                            case "serie":
                                result = conexion.EQUIPO.Where(x => x.serie.Contains(value)).ToList();
                                break;
                            case "codigo":
                                result = conexion.EQUIPO.Where(x => x.codigo.Contains(value)).ToList();
                                break;
                        }
                    }
                    else
                    {
                        //retornamos todos los valores
                        result = conexion.EQUIPO.ToList();
                    }
                    
                    return result;
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }

        internal System.Data.DataTable getListEquiposxRepGeneral(string codigo, string descripcion, string idmarca, string idmodelo)
        {
            DataTable result = new DataTable();

            using (conexion = new ConexionDataContext())
            {
                var query = conexion.usp_listarEquipos(codigo, descripcion, idmarca, idmodelo);

                result.Columns.Add("idequipo", Type.GetType("System.String"));
                result.Columns.Add("idCaracteristica", Type.GetType("System.String"));
                result.Columns.Add("nombreEquipo", Type.GetType("System.String"));
                result.Columns.Add("codigo", Type.GetType("System.String"));
                result.Columns.Add("nombreModelo", Type.GetType("System.String"));
                result.Columns.Add("nombreMarca", Type.GetType("System.String"));
                result.Columns.Add("nombreCaracteristica", Type.GetType("System.String"));
                result.Columns.Add("descripcion", Type.GetType("System.String"));

                DataRow dr;

                foreach (var c in query)
                {
                    dr = result.NewRow();

                    dr[0] = c.idequipo;
                    dr[1] = c.idCaracteristica;
                    dr[2] = c.nombreEquipo;
                    dr[3] = c.codigo;
                    dr[4] = c.nombreModelo;
                    dr[5] = c.nombreMarca;
                    dr[6] = c.nombreCaracteristica;
                    dr[7] = c.descripcion;

                    result.Rows.Add(dr);
                }

                return result;
            }
        }
    }
}
